package com.mybatisplus.startup;

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.*;

/**
 * 逆向工程
 * @author sk
 */
public class Generator {

 /**
  * <p>
  * 读取控制台内容
  * </p>
  */
 private static String scanner() {
  Scanner scanner = new Scanner(System.in);
  System.out.println("请输入表名,多个英文逗号分割：");
  if (scanner.hasNext()) {
   String ipt = scanner.next();
   if (StringUtils.isNotBlank(ipt)) {
    return ipt;
   }
  }
  throw new MybatisPlusException("请输入正确的表名,多个英文逗号分割！");
 }

 /**
  * 执行代码生成器
  * @param args
  */
 public static void main(String[] args) {
  // 代码生成器
  AutoGenerator mpg = new AutoGenerator();

  // 全局配置
  GlobalConfig gc = new GlobalConfig();
  // 项目目录
  String projectPath = System.getProperty("user.dir");
  // 输出位置
  gc.setOutputDir(projectPath + "/src/main/java/");
  // 作者
  gc.setAuthor("shikun");
  // 配置文档
  gc.setSwagger2(true);
  // 默认mybatis结果映射
  gc.setBaseResultMap(true);
  // 默认字段映射
  gc.setBaseColumnList(true);
  // 覆盖已有文件
  gc.setFileOverride(true);
  // 打开输出目录
  gc.setOpen(false);
  // 日期类型java.util.date
  gc.setDateType(DateType.ONLY_DATE);
  mpg.setGlobalConfig(gc);

  //数据源配置
  DataSourceConfig dc = new DataSourceConfig();
  dc.setUrl("jdbc:mysql://590eaa6289155.bj.cdb.myqcloud.com:3705/zhongyi?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC");
  dc.setDriverName("com.mysql.cj.jdbc.Driver");
  dc.setUsername("root");
  dc.setPassword("77kjXHG01");
  mpg.setDataSource(dc);

  // 包配置
  PackageConfig pc = new PackageConfig();
  // 父级目录
  pc.setParent("com.menhai.personmanagement");
  // 实体类目录
  pc.setEntity("entity");
  // 自定义生成路径信息
  Map<String, String> pathInfo = new HashMap<>(6);
  // 实体类输出目录
  pathInfo.put(ConstVal.ENTITY_PATH, gc.getOutputDir() + pc.getParent().replace(".","/") + "/entity/");
  // mapper输出目录
  pathInfo.put(ConstVal.MAPPER_PATH, gc.getOutputDir() + pc.getParent().replace(".","/") + "/mapper/");
  // mapper映射输出目录
  pathInfo.put(ConstVal.XML_PATH, gc.getOutputDir().replace("/java/", "/resources/mapping/"));
  // 接口输出目录
  pathInfo.put(ConstVal.SERVICE_PATH, gc.getOutputDir() + pc.getParent().replace(".","/") + "/services/");
  // 接口实现类输出目录
//  pathInfo.put(ConstVal.SERVICE_IMPL_PATH, gc.getOutputDir() + pc.getParent().replace(".","/") + "/service/impl/" );
  // controller输出目录
  pathInfo.put(ConstVal.CONTROLLER_PATH, gc.getOutputDir() + pc.getParent().replace(".","/") +"/controller/" );
  pc.setPathInfo(pathInfo);
  mpg.setPackageInfo(pc);

  //自定义配置
  InjectionConfig cfg = new InjectionConfig() {
   @Override
   public void initMap() {
    // to do nothing
   }
  };
  mpg.setCfg(cfg);

  //配置模板
  TemplateConfig templateConfig = new TemplateConfig();

  // 配置自定义输出模板
  templateConfig.setEntity("generator/templates/entity.java");
  templateConfig.setMapper("generator/templates/mapper.java");
  templateConfig.setXml("generator/templates/mapper.xml");
  templateConfig.setController("generator/templates/controller.java");
  templateConfig.setService("generator/templates/service.java");
//  templateConfig.setServiceImpl("generator/templates/serviceImpl.java");
  mpg.setTemplate(templateConfig);

  // 策略配置
  StrategyConfig strategy = new StrategyConfig();
  // 设置表明命名格式
  strategy.setNaming(NamingStrategy.underline_to_camel);
  // 设置字段命名格式
  strategy.setColumnNaming(NamingStrategy.no_change);
  // 控制台逗号分隔
  strategy.setInclude(scanner().split(","));
  // 实体是否为lombok模型
  strategy.setEntityLombokModel(true);
  // 生成 @RestController 控制器
  strategy.setRestControllerStyle(true);
  // 驼峰转连字符
  strategy.setControllerMappingHyphenStyle(true);
  // 数据库注释
  strategy.setEntityTableFieldAnnotationEnable(true);
  // 逻辑删除字段
  strategy.setLogicDeleteFieldName("isdel");
  // 表名前缀
  List<String> tables = Arrays.asList(strategy.getInclude());
  // 去掉第一个下划线
//  strategy.setTablePrefix(tables.stream().map(table -> table.split("_")[0]).toArray(String[]::new));
  mpg.setStrategy(strategy);
  // 使用freemarker模板
  mpg.setTemplateEngine(new FreemarkerTemplateEngine());
  mpg.execute();
 }
}
